/**
 * 格式化日期
 * @param date 日期对象
 * @param fmt 格式化字符串
 * @returns 格式化后的日期字符串
 */
export function formatDate(date: Date, fmt: string): string {
  const o: Record<string, number> = {
    'M+': date.getMonth() + 1, // 月份
    'D+': date.getDate(), // 日
    'H+': date.getHours(), // 小时
    'm+': date.getMinutes(), // 分
    's+': date.getSeconds(), // 秒
    'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
    'S': date.getMilliseconds() // 毫秒
  };
  
  if (/(Y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
  }
  
  for (const k in o) {
    if (new RegExp('(' + k + ')').test(fmt)) {
      fmt = fmt.replace(
        RegExp.$1, 
        RegExp.$1.length === 1 ? o[k] + '' : ('00' + o[k]).substr(('' + o[k]).length)
      );
    }
  }
  
  return fmt;
}

/**
 * 获取相对时间描述
 * @param date 日期对象或时间戳
 * @returns 相对时间描述
 */
export function getRelativeTime(date: Date | number): string {
  const now = new Date().getTime();
  const targetTime = typeof date === 'number' ? date : date.getTime();
  const diff = now - targetTime;
  
  // 小于1分钟
  if (diff < 60 * 1000) {
    return '刚刚';
  }
  
  // 小于1小时
  if (diff < 60 * 60 * 1000) {
    return Math.floor(diff / (60 * 1000)) + '分钟前';
  }
  
  // 小于1天
  if (diff < 24 * 60 * 60 * 1000) {
    return Math.floor(diff / (60 * 60 * 1000)) + '小时前';
  }
  
  // 小于30天
  if (diff < 30 * 24 * 60 * 60 * 1000) {
    return Math.floor(diff / (24 * 60 * 60 * 1000)) + '天前';
  }
  
  // 大于30天，返回具体日期
  return formatDate(new Date(targetTime), 'yyyy-MM-dd');
}

/**
 * 判断日期是否为今天
 * @param date 日期对象或日期字符串
 * @returns 是否为今天
 */
export function isToday(date: Date | string): boolean {
  const today = dayjs().format('YYYY-MM-DD');
  const targetDay = dayjs(date).format('YYYY-MM-DD');
  return today === targetDay;
}

/**
 * 判断日期是否为昨天
 * @param date 日期对象或日期字符串
 * @returns 是否为昨天
 */
export function isYesterday(date: Date | string): boolean {
  const yesterday = dayjs().subtract(1, 'day').format('YYYY-MM-DD');
  const targetDay = dayjs(date).format('YYYY-MM-DD');
  return yesterday === targetDay;
}

/**
 * 获取两个日期之间的天数差
 * @param startDate 开始日期
 * @param endDate 结束日期
 * @returns 天数差
 */
export function getDaysDiff(startDate: Date | string, endDate: Date | string): number {
  return dayjs(endDate).diff(dayjs(startDate), 'day');
}

/**
 * 将秒数转换为时分秒格式
 * @param seconds 秒数
 * @returns 格式化后的时间字符串 (HH:MM:SS)
 */
export function formatSeconds(seconds: number): string {
  const hours = Math.floor(seconds / 3600);
  const minutes = Math.floor((seconds % 3600) / 60);
  const secs = seconds % 60;
  
  return [
    hours.toString().padStart(2, '0'),
    minutes.toString().padStart(2, '0'),
    secs.toString().padStart(2, '0')
  ].join(':');
}

/**
 * 获取指定日期所在月份的第一天
 * @param date 日期对象或日期字符串
 * @returns 月份第一天的日期对象
 */
export function getFirstDayOfMonth(date: Date | string): Date {
  return dayjs(date).startOf('month').toDate();
}

/**
 * 获取指定日期所在月份的最后一天
 * @param date 日期对象或日期字符串
 * @returns 月份最后一天的日期对象
 */
export function getLastDayOfMonth(date: Date | string): Date {
  return dayjs(date).endOf('month').toDate();
}

